package com.ruoyi.web.controller.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

@RestController
@RequestMapping("/api/redis")
public class RedisController {
    @Autowired
    private RedisUtils redisUtils;  // 自动注入工具类
    @Autowired
    private RedisUtilsTwo redisUtilsTwo;

    /**
     * 动态创建 getId 方法的方法引用
     * @param entityClass 实体类
     * @param <T> 实体类型
     * @return Function<T, String> 方法引用
     */
    public <T> Function<T, String> createGetIdMethodReference(Class<T> entityClass) {
        try {
            // 获取 getId 方法
            Method getIdMethod = entityClass.getMethod("getId");

            // 创建并返回方法引用
            return entity -> {
                try {
                    Object result = getIdMethod.invoke(entity);
                    return result != null ? result.toString() : null;
                } catch (Exception e) {
                    throw new RuntimeException("Failed to invoke getId method", e);
                }
            };
        } catch (NoSuchMethodException e) {
            throw new RuntimeException("No getId method found in class: " + entityClass.getName(), e);
        }
    }


    @PostMapping("/set")
    public RedisUtils.PageResult<User> set(@RequestParam String key, @RequestParam String value) {
// 存储数据
        List userList = Arrays.asList(
                new User("1", "张三", 25, "技术部"),
                new User("2", "李四", 30, "市场部"),
                new User("3", "王五", 28, "技术部"),
                new User("4", "赵六", 35, "财务部"),
                new User("5", "钱七", 22, "市场部"),
                new User("6", "孙八", 32, "技术部"),
                new User("7", "周九", 29, "人事部"),
                new User("8", "吴十", 26, "销售部")
        );


        redisUtilsTwo.builder().keyPrefix("user")
                .indexKey("users:index")
                .dataList(userList)
                .keyExtractor((obj -> {
                    if (!(obj instanceof User)) {
                        throw new IllegalArgumentException("dataList中包含非User类型对象");
                    }
                    User user = (User) obj;
                    return user.getId().toString();
                })).store();

// 分页查询（带条件）

        // 构建查询条件
        Map<String, Object> conditions = new HashMap<>();
// 简单条件（等于）
// 复杂条件（年龄大于等于18且小于等于30）
        Map<String, Object> ageConditions = new HashMap<>();
        ageConditions.put(RedisUtilsTwo.OP_GTE, 18);
        ageConditions.put(RedisUtilsTwo.OP_LTE, 30);
        conditions.put("age", ageConditions);
        // 查询结果
        RedisUtilsTwo.PageResult<String> result = redisUtilsTwo.builder()
                .keyPrefix("user")
                .indexKey("users:index")
                .pageQuery(1, 10, conditions, null, false);
        //删除
        redisUtilsTwo.builder()
                .keyPrefix("user")
                .indexKey("users:index").deleteAll();

        RedisUtilsTwo.PageResult<String> result2 = redisUtilsTwo.builder()
                .keyPrefix("user")
                .indexKey("users:index")
                .pageQuery(1, 10, conditions, null, false);

        System.out.println();
//        redisUtils.builder(User.class)
//                .keyPrefix("user")
//                .indexKey("users:index")
//                .dataList(userList)
//                .keyExtractor(User::getId)
//                .expireTime(3600)
//                .store();

//// 带二级索引的存储
//        RedisUtils.builder(redisTemplate, User.class)
//                .keyPrefix("user")
//                .indexKey("users:index")
//                .dataList(userList)
//                .keyExtractor(User::getId)
//                .fieldExtractor(User::getDepartment)
//                .secondaryIndex("users:dept")
//                .expireTime(3600)
//                .storeWithSecondaryIndex();


//        // 测试按年龄升序排序
//        System.out.println("=== 按年龄升序排序 ===");
//        RedisUtils.PageResult<User> result1 = redisUtils.builder(User.class)
//                .indexKey("users:index")
//                .pageQuery(1, 5, null, Comparator.comparingInt(User::getAge));
//
//
//        redisUtils.builder(User.class)
//                .keyPrefix("user")
//                .indexKey("users:index")
//                .deleteAll();
//
//        RedisUtils.PageResult<User> result12 = redisUtils.builder(User.class)
//                .indexKey("users:index")
//                .pageQuery(1, 5, null, Comparator.comparingInt(User::getAge));
//
//        // 测试按薪资降序排序
//        System.out.println("\n=== 按年龄降序排序 ===");
//        RedisUtils.PageResult<User> result2 = redisUtils.builder(User.class)
//                .indexKey("users:index")
//                .pageQuery(1, 5, null, Comparator.comparingInt(User::getAge).reversed());
//
//        result2.getList().forEach(user ->
//                System.out.println(user.getName() + " - 年龄:" + user.getAge()));
//
////构造器获取
//// 分页查询
//        RedisUtils.PageResult<User> pageResult = redisUtils.builder(User.class)
//                .indexKey("users:index")
//                .pageQuery(1, 10, user -> user.getAge() > 25);
//
//        System.out.println("分页查询结果: " + pageResult);
//
//// 根据ID获取单个对象
//        User oneuser = redisUtils.builder(User.class)
//                .keyPrefix("user")
//                .getById("1");
//
//// 批量获取对象
//        List<User> users = redisUtils.builder(User.class)
//                .keyPrefix("user")
//                .getByIds(Arrays.asList("1", "2"));
//
//// 删除对象
//        redisUtils.builder(User.class)
//                .keyPrefix("user")
//                .indexKey("users:index")
//                .delete("1");
//
//// 获取索引大小
//        long size = redisUtils.builder(User.class)
//                .indexKey("users:index")
//                .getIndexSize();
//
//
////// 快速存储单个对象
//        redisUtils.storeSingle(
//                User.class,
//                "user",
//                "users:index",
//                new User("3", "王五", 28, "销售部"),
//                User::getId,
//                3600
//        );
//
//// 快速读取单个对象
//        User twouser = redisUtils.readSingle(
//                User.class,
//                "user",
//                "1"
//        );
//
//// 快速读取所有对象
//        List<User> allUsers = redisUtils.readAll(
//                User.class,
//                "users:index"
//        );
//
//// 快速分页查询
//        RedisUtils.PageResult<User> twopageResult = redisUtils.quickPageQuery(
//                User.class,
//                "users:index",
//                1,
//                10
//        );
//
//        System.out.println();

        return null;
    }

    @GetMapping("/get")
    public Object get(@RequestParam String key) {
        Object value = null;
        return value != null ? value : "键不存在";
    }

}
